package com.yfp.goods.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.github.pagehelper.util.StringUtil;
import com.yfp.common.core.constant.DbConstants;
import com.yfp.common.core.exception.ServiceException;
import com.yfp.common.core.utils.uuid.Snowflake;
import com.yfp.common.datascope.annotation.DataScope;
import com.yfp.common.security.utils.SecurityUtils;
import com.yfp.goods.domain.Goods;
import com.yfp.goods.domain.GoodsType;
import com.yfp.goods.domain.vo.GoodsTypeVo;
import com.yfp.goods.mapper.GoodsMapper;
import com.yfp.goods.mapper.GoodsTypeMapper;
import com.yfp.goods.service.GoodsTypeService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 商品类型表(GoodsType)表服务实现类
 *
 * 
 * @since 2023-12-20 22:23:10
 */
@Service("goodsTypeService")
public class GoodsTypeServiceImpl implements GoodsTypeService {
    @Resource
    private GoodsTypeMapper goodsTypeMapper;

    @Resource
    private GoodsMapper goodsMapper;

    /**
     * 通过ID查询单条数据
     *
     * @param goodsTypeId 主键
     * @return 实例对象
     */
    @Override
    public GoodsType queryById(String goodsTypeId) {
        return this.goodsTypeMapper.queryById(goodsTypeId);
    }

    /**
     * 分页查询
     *
     * @param goodsType   筛选条件
     * @return 查询结果
     */
    @Override
    @DataScope(deptAlias = "t")
    public List<GoodsType> queryByPage(GoodsType goodsType) {
        return this.goodsTypeMapper.queryAllByLimit(goodsType);
    }

    /**
     * 新增数据
     *
     * @return 实例对象
     */
    @Override
    public GoodsType insert(String goodsTypeName ,String cityName) {
        verifyDuplicate(goodsTypeName,null,cityName);
        GoodsType goodsType = new GoodsType();
        goodsType.setGoodsTypeName(goodsTypeName);
        long id = new Snowflake(1).nextId();
        goodsType.setGoodsTypeId(String.valueOf(id));
        goodsType.setUpdateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
        goodsType.setCityName(cityName);
        Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
        goodsType.setDeptId(deptId);
        this.goodsTypeMapper.insert(goodsType);
        return goodsType;
    }

    /**
     * 验证重复
     *
     * @param goodsTypeName 商品类型名称
     */
    @DataScope(deptAlias = "t")
    private void verifyDuplicate(String goodsTypeName,String goodsTypeId,String cityName) {
        GoodsType goodsType = new GoodsType();
        if (!StringUtil.isEmpty(goodsTypeId)) {
            goodsType.setGoodsTypeId(goodsTypeId);
        }
        if (!StringUtil.isEmpty(goodsTypeName)) {
            goodsType.setTypeName(goodsTypeName);
        }
        if (!StringUtil.isEmpty(cityName)) {
            goodsType.setCityName(cityName);
        }
        List<GoodsType> goodsTypes = this.goodsTypeMapper.queryAllByLimit(goodsType);

        if (!CollUtil.isEmpty(goodsTypes)) {
            throw new ServiceException("该分类名称已存在,不可重复添加");
        }
    }

    /**
     * 修改数据
     *
     * @param goodsTypeVo 实例对象
     * @return 实例对象
     */
    @Override
    public GoodsType update(GoodsTypeVo goodsTypeVo) {
        verifyDuplicate(goodsTypeVo.getGoodsTypeName(), goodsTypeVo.getGoodsTypeId(),goodsTypeVo.getCityName());
        GoodsType goodsType = new GoodsType();
        BeanUtil.copyProperties(goodsTypeVo, goodsType);
        goodsType.setUpdateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
        goodsType.setUpdateTime(new Date());
        this.goodsTypeMapper.update(goodsType);
        return this.queryById(goodsType.getGoodsTypeId());
    }

    @Override
    public boolean disableGoodsType(String goodsTypeId) {
        List<Goods> goods =  goodsMapper.queryGoodsByGoodsTypeId(goodsTypeId);
        if (CollUtil.isNotEmpty(goods)) throw new ServiceException("该商品标签绑定了商品");

        GoodsType goodsType = this.goodsTypeMapper.queryById(goodsTypeId);
        if (ObjectUtil.isNull(goodsType)) throw new ServiceException("未查询到商品类型标签");

        boolean result = Objects.equals(goodsType.getEnable(),DbConstants.ENABLE_NORMAL);
        goodsType.setEnable( result ? DbConstants.DISABLED_ABNORMAL : DbConstants.ENABLE_NORMAL);
        goodsType.setUpdateTime(new Date());
        goodsType.setUpdateBy(SecurityUtils.getLoginUser().getSysUser().getNickName());
        return this.goodsTypeMapper.update(goodsType) > 0 ;
    }
}
